package com.cos.openapi.services.impl;

import com.cos.openapi.dao.MenuMapper;
import com.cos.openapi.entity.AdminUser;
import com.cos.openapi.entity.Menu;
import com.cos.openapi.pojo.JsonResult;
import com.cos.openapi.pojo.TableResult;
import com.cos.openapi.services.MenuServices;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: COS
 * @time: 2021/1/29 10:24
 * @description:
 */
@Service
public class MenuServicesImpl implements MenuServices {
    @Autowired
    private MenuMapper menuMapper;
    @Override
    public int deleteByPrimaryKey(Integer id) {
        return 0;
    }

    @Override
    public int insert(Menu record) {
        return 0;
    }

    @Override
    public int insertSelective(Menu record) {
        return 0;
    }

    @Override
    public Menu selectByPrimaryKey(Integer id) {
        return null;
    }

    @Override
    public int updateByPrimaryKeySelective(Menu record) {
        return 0;
    }

    @Override
    public int updateByPrimaryKey(Menu record) {
        return 0;
    }

    @Override
    public List<Menu> getMenuTree(Integer id) {
        //获取原始的所有权限菜单数据
        List<Menu> menuTree = menuMapper.getMenuTree(id);
        //返回生成的树状菜单
        return markMenuTree(menuTree);
    }

    /**
     *
     * @author: COS
     * @return:
     * @time: 2021/1/29 10:25
     * @description: 创建并生成对应的树状菜单数据
     */
    public List<Menu> markMenuTree(List<Menu> menuTree){
        //保存树状菜单数据
        List<Menu> list = new ArrayList<>();
        //创建map集合暂时存储菜单数据,方便整合多级菜单
        Map<Integer,Menu> map =new HashMap<>();
        for (Menu menu : menuTree) {
            //key为主键   value为对象数据
            map.put(menu.getId(),menu);
            //没有父级id即为1级菜单
            if (menu.getParentId()==null) {
                //把数据加入到1级菜单中
                list.add(menu);
            }
        }
        for (Menu menu : menuTree) {
            if (menu.getType()==1) {
                //为子菜单 并且map有他的数据
                if (menu.getParentId() != null&&map.containsKey(menu.getParentId())) {
                    //使用父id来获取父级菜单对象
                    map.get(menu.getParentId()).getChildren().add(menu);
                }
            }
        }
        return list;
    }

    @Override
    public List<Menu> menuTree() {
        List<Menu> menus=  menuMapper.getAllMenu();
        //保存父级节点数据
        List<Menu> firstList=new ArrayList<>();
        Map<Integer,Menu> map=new HashMap<>();
        //循环
        for (Menu menu : menus) {
            map.put(menu.getId(), menu);
            //父节点
            if (menu.getParentId() == null) {
                firstList.add(menu);
            }
        }
        //循环 子节点
        for (Menu menu : menus) {
            if (menu.getParentId() != null&&map.containsKey(menu.getParentId())) {
                map.get(menu.getParentId()).getChildren().add(menu);
            }
        }

        return firstList;
    }


    @Override
    public TableResult getList() {
        //找所有数据
        List<Menu> allMenu = menuMapper.getAllMenu();
        //先找到父级目录
        //保存父级数据的集合
        List<Menu> firstList= new ArrayList<>();
        //使用map帮助我们简单修改数据
        Map<Integer,Menu> map = new HashMap<>();
        //找父级目录
        for (Menu menu : allMenu) {
            //把数据保存到map中,利用内存地址传递来修改数据
            map.put(menu.getId(), menu);
            //找父级目录,放到父级数据的集合
            if (menu.getParentId() == null) {
                //保存数据到父级集合
                firstList.add(menu);
            }
        }
        //找子级目录
        for (Menu menu : allMenu) {
            if (menu.getParentId()!=null&&map.containsKey(menu.getParentId())) {
                //找到父级
                map.get(menu.getParentId()).getChildren().add(menu);
            }
        }
        //firstList 保存了父级目录数据,父级目录数据中有子级目录的数据getChildren(list集合)
        //target把整理好顺序的数据存放到target集合当中,返回展示
        //使用使用引用类型数据的内存地址,来进行数据修改
        List<Menu> target= new ArrayList<>();
        //调用递归方法进行处理排序
        getAllMenuTree(firstList, target);
        return TableResult.getResultBySuccess((long)target.size(), target);
    }

    /**
     * 进行菜单数据排序
     * @param firstList
     * @param target
     */
    public void getAllMenuTree(List<Menu> firstList,List<Menu> target){
        for (Menu menu : firstList) {
            //先把父级目录加入目标集合当中保存
            target.add(menu);
            //如果子级集合长度大于0,就代表有子级目录存在
            if (menu.getChildren().size()>0) {
                //进行递归循环处理
                getAllMenuTree(menu.getChildren(),target);
            }
        }
    }

    @Override
    public Menu getInfo(Integer id) {
        if (id>0) {
            return menuMapper.selectByPrimaryKey(id);
        }
        return null;
    }

    @Override
    public List<Menu> getTree() {
        List<Menu> allMenu = menuMapper.getAllMenu();
        //使用已有的找父级子级的工具方法
        return markMenuTree(allMenu);
    }

    @Override
    public JsonResult addMenu(Menu menu) {
        int i = menuMapper.insertSelective(menu);
        if (i>0) {
            return JsonResult.getJsonResultBySuccess("成功");
        }
        return JsonResult.getJsonResultByFail("失败");
    }

    @Override
    public JsonResult updateMenu(Menu menu) {
        int i = menuMapper.updateByPrimaryKey(menu);
        if (i>0) {
            return JsonResult.getJsonResultBySuccess("成功");
        }
        return JsonResult.getJsonResultByFail("失败");
    }
}
